int longestValidParentheses(char * s) {
    int len = strlen(s); if (len == 0) return 0;

    int dp[len];    // dp[i]表示以s[i]结尾的子串中，形成的最长有效子串的长度，且有效子串是以s[i]为结尾的
    // 有效子串以s[i]结尾，才能提供给后一个子问题计算；
    // 后一个子问题的解，要想融入前面提供的子串，则前面子串的末尾必须是有效子串的一部分
    for (int i = 0; i < len; i++) dp[i] = 0;

    int maxlen = 0;
    for (int i = 1; i < len; i++) {
        if (s[i] == ')') { // 提供给后面的串
            if (s[i - 1] == '(') {  // 与前一个(匹配
                // i-2存在则将新形成的()子串融入前面dp[i-2]的部分
                dp[i] = (i >= 2)? (dp[i - 2] + 2):2;
            } 
            
            else if (i-dp[i-1] - 1 >= 0 && s[i-dp[i-1] - 1] == '(') { // 跨过一个子串与(匹配
                // 例如前s[0,i-1]为(()()，对应dp[0, i-1]为【0, 0, 2, 0, 4】；
                // 新来一个')'，可以跨过dp[i-1]长度，与第一个的(形成有效括号

                // 而如果(()()的前面还有其它有效括号，也要联结起来，即加上原本被第一个(分隔的前面子串
                dp[i] = (i-dp[i-1] - 2 >= 0)? (dp[i-1] + 2 + dp[i - dp[i-1] - 2]):(dp[i-1] + 2);
            }
        }
        else ;// 以s[i]结尾的的子串不是有效子串
        maxlen = fmax(maxlen, dp[i]);
    }
    return maxlen;
}